package org.jeecg.modules.rule.controller;

import java.io.UnsupportedEncodingException;
import java.io.IOException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.hutool.json.JSONUtil;
import com.alibaba.druid.sql.visitor.functions.If;
import org.apache.commons.lang.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.modules.meta.entity.SysFieldinfo;
import org.jeecg.modules.meta.entity.SysTableinfo;
import org.jeecg.modules.meta.service.ISysFieldinfoService;
import org.jeecg.modules.meta.service.ISysTableinfoService;
import org.jeecg.modules.pubmgr.entity.SysProjectAuth;
import org.jeecg.modules.pubmgr.service.ISysProjectAuthService;
import org.jeecg.modules.rule.entity.*;
import org.jeecg.modules.rule.service.*;
import org.jeecg.modules.rule.vo.OpersscDetailAddVO;
import org.jeecg.modules.run.entity.RunDetail;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
import org.jeecgframework.poi.excel.entity.ImportParams;
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;

import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.rule.vo.OpersscTpPage;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import com.alibaba.fastjson.JSON;

/**
 * @Description: 手工脱敏表复核
 * @Author: jeecg-boot
 * @Date: 2019-06-17
 * @Version: V1.0
 */
@RestController
@RequestMapping("/rule/opersscTpReview")
@Slf4j
public class OpersscTPReviewController {
    @Autowired
    private IOpersscTpService opersscTpService;
    @Autowired
    private IOpersscTabdetailService opersscTabdetailService;
    @Autowired
    private IOpersscFiddetailService opersscFiddetailService;
    @Autowired
    private ISysTableinfoService iSysTableinfoService;
    @Autowired
    private IOpersscFoService opersscFoService;
    @Autowired
    private IOpersscArService opersscArService;
    @Autowired
    ISysProjectAuthService iSysProjectAuthService;

    /**
     * 分页列表查询
     *
     * @param opersscTp
     * @param pageNo
     * @param pageSize
     * @param req
     * @return
     */
    @GetMapping(value = "/list")
    public Result<IPage<OpersscTp>> queryPageList(OpersscTp opersscTp,
                                                  @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                                  @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                                  HttpServletRequest req) {

        Result<IPage<OpersscTp>> result = new Result<IPage<OpersscTp>>();
        Page<OpersscTp> page = new Page<OpersscTp>(pageNo, pageSize);
        QueryWrapper<OpersscTp> queryWrapper = QueryGenerator.initQueryWrapper(opersscTp, req.getParameterMap());
       queryWrapper.notIn("fd_status", "1");
        //设置应用工程过滤
        List<String> projectList = getProjectListByUserId();
        if(null == projectList || projectList.size() == 0){
            result.setSuccess(true);
            result.setResult(page);
            return result;
        }
        queryWrapper.in("fd_project", projectList);
        IPage<OpersscTp> pageList = opersscTpService.page(page, queryWrapper);
        result.setSuccess(true);
        result.setResult(pageList);
        return result;
    }

    private List<String> getProjectListByUserId() {
        List<String> projectList = new ArrayList<>();

        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        //用户id
        String userId = sysUser.getId();
        //获取用户对应的工程list
        QueryWrapper<SysProjectAuth> queryWrapper = new QueryWrapper<>();
        queryWrapper.in("fd_userId", userId);
        List<SysProjectAuth> sysProjectAuths = iSysProjectAuthService.list(queryWrapper);

        if (null != sysProjectAuths && sysProjectAuths.size() > 0) {
            for (SysProjectAuth sysProjectAuth : sysProjectAuths){
                projectList.add(sysProjectAuth.getFdProjid());
            }
        }
        return projectList;
    }

    /**
     * 添加
     *
     * @param opersscTpPage
     * @return
     */
    @PostMapping(value = "/add")
    public Result<OpersscTp> add(@RequestBody OpersscTpPage opersscTpPage) {
        Result<OpersscTp> result = new Result<OpersscTp>();
        try {
            OpersscTp opersscTp = new OpersscTp();
            BeanUtils.copyProperties(opersscTpPage, opersscTp);

            opersscTpService.save(opersscTp);
            result.success("添加成功！");
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            result.error500("操作失败");
        }
        return result;
    }

    /**
     * 通过fdTableId查询t_dex_operssc_flddetail字段信息
     *
     * @param fdTableId
     * @return
     */
    @GetMapping(value = "/showOpersscFiddetail")
    public Result<IPage<OpersscFiddetail>> showFieldinfo(String fdTableId,
                                                         String fdSscid,
                                                         @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                                         @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                                         HttpServletRequest req) {

        Result<IPage<OpersscFiddetail>> result = new Result<IPage<OpersscFiddetail>>();
        OpersscFiddetail opersscFiddetail = new OpersscFiddetail();
        opersscFiddetail.setFdTableId(fdTableId);
        QueryWrapper<OpersscFiddetail> queryWrapper = QueryGenerator.initQueryWrapper(opersscFiddetail, req.getParameterMap());
        queryWrapper.in("fd_sscid", fdSscid);
        Page<OpersscFiddetail> page = new Page<OpersscFiddetail>(pageNo, pageSize);
        IPage<OpersscFiddetail> pageList = opersscFiddetailService.page(page, queryWrapper);
        result.setSuccess(true);
        result.setResult(pageList);
        return result;
    }

    /**
     * 编辑
     *
     * @param opersscTpPage
     * @return
     */
    @PutMapping(value = "/edit")
    public Result<OpersscTp> edit(@RequestBody OpersscTpPage opersscTpPage) {
        Result<OpersscTp> result = new Result<OpersscTp>();
        OpersscTp opersscTp = new OpersscTp();
        BeanUtils.copyProperties(opersscTpPage, opersscTp);
        OpersscTp opersscTpEntity = opersscTpService.getById(opersscTp.getId());
        if (opersscTpEntity == null) {
            result.error500("未找到对应实体");
        } else {
            opersscTpService.updateById(opersscTp);
            result.success("修改成功!");
        }

        return result;
    }

    /**
     * 复核通过
     *
     * @return
     */
    @GetMapping(value = "/updateSscidMigration")
    public Result<OpersscTp> updateToSubmitSscid(String ids, HttpServletRequest req) {
        Result<OpersscTp> result = new Result<OpersscTp>();
        OpersscTp opersscTp = new OpersscTp();
        opersscTp.setId(ids);
        QueryWrapper<OpersscTp> queryWrapper = QueryGenerator.initQueryWrapper(opersscTp, req.getParameterMap());
        OpersscTp one = opersscTpService.getOne(queryWrapper);

        if (one.getFdStatus().equals("3")) {
            result.error500("打回状态不可复核");
            return result;
        }
        if (opersscTp.getId() == null) {
            result.error500("未找到对应实体");
        } else {
            one.setFdStatus("1");
            LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
            one.setFdCheckUser2(sysUser.getId());
            OpersscFo opersscFo = this.setOpersscFo(one, ids);
            opersscFoService.save(opersscFo);
            opersscTpService.removeById(one.getId());
            //历史记录
            OpersscAr opersscAr = OpersscTpController.setOpersscAr(one);
            opersscAr.setFdStatus("4");
            //设置创建时间
            opersscAr.setCreateTime(OpersscTpController.setCreateTime());
            opersscArService.save(opersscAr);
            result.success("复核通过成功!");
        }

        return result;
    }

    /**
     * 将 OpersscTp插入到OpersscFo表
     *
     * @param opersscTp
     * @return OpersscFo
     */

    private OpersscFo setOpersscFo(OpersscTp opersscTp, String ids) {
        OpersscFo opersscFo = new OpersscFo();
        opersscFo.setFdCheckUser2(opersscTp.getFdCheckUser2());
        opersscFo.setFdCheckTime2(opersscTp.getFdCheckTime2());
        opersscFo.setFdCheckCast2(opersscTp.getFdCheckCast2());
        opersscFo.setFdApplyUser(opersscTp.getFdApplyUser());
        opersscFo.setFdApplyTime(opersscTp.getFdApplyTime());
        opersscFo.setFdApplyCast(opersscTp.getFdApplyCast());
        opersscFo.setCreateUser(opersscTp.getCreateUser());
        opersscFo.setCreateTime(opersscTp.getCreateTime());
        opersscFo.setFdDes(opersscTp.getFdDes());
        opersscFo.setFdExpain(opersscTp.getFdExpain());
        opersscFo.setFdName(opersscTp.getFdName());
        opersscFo.setFdProject(opersscTp.getFdProject());
        opersscFo.setFdRelease(opersscTp.getFdRelease());
        opersscFo.setFdRunDate(opersscTp.getFdRunDate());
        opersscFo.setFdRunEndDate(opersscTp.getFdRunEndDate());
        opersscFo.setFdStatus(opersscTp.getFdStatus());
        opersscFo.setIsDelete(opersscTp.getIsDelete());
        opersscFo.setUpdateTime(opersscTp.getUpdateTime());
        opersscFo.setUpdateUser(opersscTp.getUpdateUser());
        opersscFo.setFdSource(opersscTp.getFdSource());
        opersscFo.setId(ids);
        return opersscFo;
    }

    /**
     * 打回修改
     *
     * @return
     */
    @GetMapping(value = "/updateRepulseSscid")
    public Result<OpersscTp> updateRepulseSscid(String ids, HttpServletRequest req) {
        OpersscTp opersscTp = new OpersscTp();
        opersscTp.setId(ids);
        Result<OpersscTp> result = new Result<OpersscTp>();

        if (opersscTp == null) {
            result.error500("未找到对应实体");
        } else {
            QueryWrapper<OpersscTp> queryWrapper = QueryGenerator.initQueryWrapper(opersscTp, req.getParameterMap());
            OpersscTp one = opersscTpService.getOne(queryWrapper);
            if (one.getFdStatus().equals("3")) {
                result.error500("已是打回状态");
                return result;
            }
            one.setFdStatus("3");
            LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
            one.setFdCheckUser2(sysUser.getId());
            opersscTpService.saveOrUpdate(one);
            //历史记录
            OpersscAr opersscAr = OpersscTpController.setOpersscAr(one);
            opersscAr.setFdStatus(one.getFdStatus());
            //设置创建时间
            opersscAr.setCreateTime(OpersscTpController.setCreateTime());
            opersscArService.save(opersscAr);
            result.success("修改成功!");
        }

        return result;
    }

    /**
     * 通过id删除
     *
     * @param id
     * @return
     */
    @DeleteMapping(value = "/delete")
    public Result<OpersscTp> delete(@RequestParam(name = "id", required = true) String id) {
        Result<OpersscTp> result = new Result<OpersscTp>();
        OpersscTp opersscTp = opersscTpService.getById(id);
        if (opersscTp == null) {
            result.error500("未找到对应实体");
        } else {
            opersscTpService.delMain(id);
            result.success("删除成功!");
        }

        return result;
    }

    /**
     * 批量删除
     *
     * @param ids
     * @return
     */
    @DeleteMapping(value = "/deleteBatch")
    public Result<OpersscTp> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
        Result<OpersscTp> result = new Result<OpersscTp>();
        if (ids == null || "".equals(ids.trim())) {
            result.error500("参数不识别！");
        } else {
            this.opersscTpService.removeByIds(Arrays.asList(ids.split(",")));
            result.success("删除成功!");
        }
        return result;
    }

    /**
     * 通过id查询
     *
     * @param id
     * @return
     */
    @GetMapping(value = "/queryById")
    public Result<OpersscTp> queryById(@RequestParam(name = "id", required = true) String id) {
        Result<OpersscTp> result = new Result<OpersscTp>();
        OpersscTp opersscTp = opersscTpService.getById(id);
        if (opersscTp == null) {
            result.error500("未找到对应实体");
        } else {
            result.setResult(opersscTp);
            result.setSuccess(true);
        }
        return result;
    }

    //===========================以下是子表信息操作相关API====================================

    /**
     * 通过主表id查询手工脱敏运行详情表
     *
     * @return
     */
    @GetMapping(value = "/listOpersscTabdetailByMainId")
    public Result<IPage<OpersscTabdetail>> queryOpersscTabdetailListByMainId(OpersscTabdetail opersscTabdetail,
                                                                             @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                                                             @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                                                             @RequestParam(name = "fdTableName", required = false) String fdTableName,
                                                                             HttpServletRequest req) {
        Result<IPage<OpersscTabdetail>> result = new Result<>();
        if (opersscTabdetail.getFdSscid() != null) {
            QueryWrapper<OpersscTabdetail> queryWrapper = QueryGenerator.initQueryWrapper(opersscTabdetail, req.getParameterMap());
            if (StringUtils.isNotEmpty(fdTableName)) {
                List<String> tabIdList = getTabIdListByName(fdTableName);
                if (tabIdList == null || tabIdList.size() == 0) {
                    return null;
                }
                queryWrapper.in("fd_table_id", tabIdList);
            }
            Page<OpersscTabdetail> page = new Page<>(pageNo, pageSize);
            IPage<OpersscTabdetail> pageList = opersscTabdetailService.page(page, queryWrapper);
            result.setSuccess(true);
            result.setResult(pageList);
            return result;
        } else {
            return null;
        }
    }

    private List<String> getTabIdListByName(String tableName) {
        QueryWrapper<SysTableinfo> queryWrapper = new QueryWrapper<>();
        queryWrapper.like("fd_tablename", tableName);
        List<SysTableinfo> list = iSysTableinfoService.list(queryWrapper);
        if (null == list || list.size() == 0) {
            return new ArrayList<>();
        }

        return covTableInfoString(list);
    }


    private List<String> covTableInfoString(List<SysTableinfo> list) {
        List<String> strings = new ArrayList<>();
        for (SysTableinfo sysTableinfo : list) {
            strings.add(sysTableinfo.getFdTableid());
        }
        return strings;
    }

    /**
     * 查询t_sys_tableinfo表
     *
     * @return
     */
    @GetMapping(value = "/listSysTableinfo")
    public Result<IPage<SysTableinfo>> queryPageListTableinfo(SysTableinfo tableinfo,
                                                              OpersscTabdetail detail,
                                                              @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
                                                              @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                                              HttpServletRequest req) {
        Result<IPage<SysTableinfo>> result = new Result<IPage<SysTableinfo>>();
        QueryWrapper<SysTableinfo> queryWrapper = QueryGenerator.initQueryWrapper(tableinfo, req.getParameterMap());
        queryWrapper.notIn("fd_status", "2");
        Page<SysTableinfo> page = new Page<SysTableinfo>(pageNo, pageSize);
        IPage<SysTableinfo> pageList = iSysTableinfoService.page(page, queryWrapper);
        result.setSuccess(true);
        result.setResult(pageList);
        return result;
    }

    /**
     * 添加自动脱敏详情表
     *
     * @return
     */
    @PostMapping(value = "/addAutosscDetail")
    public Result<OpersscTabdetail> addAutosscDetail(@RequestBody OpersscDetailAddVO opersscDetailAddVO,
                                                     HttpServletRequest req) {
        Result<OpersscTabdetail> result = new Result<>();
        boolean ok = true;
        try {
            if (opersscDetailAddVO.getFdTableId() != null && opersscDetailAddVO.getFdTableId().size() > 0) {

                for (SysTableinfo sysTableinfo : opersscDetailAddVO.getFdTableId()) {
                    OpersscTabdetail autosscDetail = new OpersscTabdetail();
                    //save
                    autosscDetail.setFdSscid(opersscDetailAddVO.getFdSscid());
                    autosscDetail.setFdTableId(sysTableinfo.getFdTableid());
                    autosscDetail.setFdStatus("1");
                    //是否存在
                    OpersscTabdetail autosscDetailOld = this.queryWrapper("fd_sscid", opersscDetailAddVO.getFdSscid(), "fd_table_id", sysTableinfo.getFdTableid());
                    if (null != autosscDetailOld) {
                        continue;
                    }
                    ok = opersscTabdetailService.save(autosscDetail);
                    if (ok) {
                        this.addOpersscFlddetail(autosscDetail, req);
                    }

                }
            }
            if (ok) {
                result.setSuccess(true);
                result.setMessage("添加自动脱敏详情表成功.");
            } else {
                result.setSuccess(false);
                result.setMessage("添加自动脱敏详情表失败!");
            }
            return result;
        } catch (Exception e) {
            e.printStackTrace();
            result.setSuccess(false);
            result.setMessage("添加自动脱敏详情表过程中出现了异常");
            return result;
        }

    }

    //queryWrapper函数
    private OpersscTabdetail queryWrapper(String column, String name, String colum2, String name2) {
        QueryWrapper queryWrapper = new QueryWrapper();
        queryWrapper.eq(column + "", name);
        queryWrapper.eq(colum2 + "", name2);
        OpersscTabdetail opersscTabdetail = opersscTabdetailService.getOne(queryWrapper);
        return opersscTabdetail;
    }

    @Autowired
    ISysFieldinfoService iSysFieldinfoService;

    @Autowired
    IOpersscFiddetailService iOpersscFiddetailService;

    //将t_sys_fieldinfo数据插入t_dex_operssc_flddetail表
    private boolean addOpersscFlddetail(OpersscTabdetail autosscDetail, HttpServletRequest req) {

        boolean ok = false;

        SysFieldinfo fieldinfo = new SysFieldinfo();
        fieldinfo.setFdTableid(autosscDetail.getFdTableId());
        QueryWrapper<SysFieldinfo> queryWrapper = QueryGenerator.initQueryWrapper(fieldinfo, req.getParameterMap());
        List<SysFieldinfo> list = iSysFieldinfoService.list(queryWrapper);
        //插入
        for (SysFieldinfo sysFieldinfo : list) {
            //拼接
            OpersscFiddetail opersscFiddetail = new OpersscFiddetail();
            opersscFiddetail.setFdSscid(autosscDetail.getFdSscid());
            opersscFiddetail.setFdTableId(sysFieldinfo.getFdTableid());
            opersscFiddetail.setFdFieldid(sysFieldinfo.getFdFieldid());
            opersscFiddetail.setFdFieldname(sysFieldinfo.getFdFieldname());
            opersscFiddetail.setFdRulename(sysFieldinfo.getFdRulename());
            opersscFiddetail.setFdRulelevel(sysFieldinfo.getFdRulelevel());

            ok = iOpersscFiddetailService.save(opersscFiddetail);
        }


        return ok;
    }

    /**
     * 添加手工脱敏运行详情表
     *
     * @param opersscTabdetail
     * @return
     */
    @PostMapping(value = "/addOpersscTabdetail")
    public Result<OpersscTabdetail> addOpersscTabdetail(@RequestBody OpersscTabdetail opersscTabdetail) {
        Result<OpersscTabdetail> result = new Result<>();
        try {
            boolean ok = opersscTabdetailService.save(opersscTabdetail);
            if (ok) {
                result.setSuccess(true);
                result.setMessage("添加手工脱敏运行详情表成功.");
            } else {
                result.setSuccess(false);
                result.setMessage("添加手工脱敏运行详情表失败!");
            }
            return result;
        } catch (Exception e) {
            e.fillInStackTrace();
            result.setSuccess(false);
            result.setMessage("添加手工脱敏运行详情表过程中出现了异常: " + e.getMessage());
            return result;
        }
    }

    /**
     * 编辑手工脱敏运行详情表
     *
     * @param opersscTabdetail
     * @return
     */
    @PutMapping("/editOpersscTabdetail")
    public Result<OpersscTabdetail> editOpersscTabdetail(@RequestBody OpersscTabdetail opersscTabdetail) {
        Result<OpersscTabdetail> result = new Result<>();
        try {
            boolean ok = opersscTabdetailService.updateById(opersscTabdetail);
            if (ok) {
                result.setSuccess(true);
                result.setMessage("更新手工脱敏运行详情表成功.");
            } else {
                result.setSuccess(false);
                result.setMessage("更新手工脱敏运行详情表失败!");
            }
            return result;
        } catch (Exception e) {
            result.setSuccess(false);
            result.setMessage("更新数据过程中出现异常啦: " + e.getMessage());
            return result;
        }
    }

    /**
     * 通过id删除手工脱敏运行详情表
     *
     * @param id
     * @return
     */
    @DeleteMapping(value = "/deleteOpersscTabdetail")
    public Result<OpersscTabdetail> deleteOpersscTabdetail(@RequestParam(name = "id", required = true) String id,
                                                           String fdSscid, String fdTableId,
                                                           HttpServletRequest req) {

        Result<OpersscTabdetail> result = new Result<>();
        OpersscFiddetail opersscFiddetail = new OpersscFiddetail();
        opersscFiddetail.setFdSscid(fdSscid);
        opersscFiddetail.setFdTableId(fdTableId);
        QueryWrapper<OpersscFiddetail> queryWrapper = QueryGenerator.initQueryWrapper(opersscFiddetail, req.getParameterMap());

        try {
            boolean ok = opersscTabdetailService.removeById(id);
            iOpersscFiddetailService.remove(queryWrapper);
            if (ok) {
                result.setSuccess(true);
                result.setMessage("删除手工脱敏运行详情表成功.");
            } else {
                result.setSuccess(false);
                result.setMessage("删除手工脱敏运行详情表失败!");
            }
            return result;
        } catch (Exception e) {
            result.setSuccess(false);
            result.setMessage("删除手工脱敏运行详情表过程中出现异常啦: " + e.getMessage());
            return result;
        }
    }

    /**
     * 批量删除手工脱敏运行详情表
     *
     * @param ids
     * @return
     */
    @DeleteMapping(value = "/deleteBatchOpersscTabdetail")
    public Result<OpersscTabdetail> deleteBatchOpersscTabdetail(@RequestParam(name = "ids", required = true) String ids,
                                                                @RequestParam(name = "fdSscid", required = true) String fdSscid,
                                                                @RequestParam(name = "fdTableId", required = true) String fdTableId,
                                                                HttpServletRequest req) {

        Result<OpersscTabdetail> result = new Result<OpersscTabdetail>();
        if (ids == null || "".equals(ids.trim())) {
            result.error500("参数不识别！");
        } else {
            this.opersscTabdetailService.removeByIds(Arrays.asList(ids.split(",")));
            OpersscFiddetail opersscFiddetail = new OpersscFiddetail();
            opersscFiddetail.setFdSscid(fdSscid);
            opersscFiddetail.setFdTableId(fdTableId);
            QueryWrapper<OpersscFiddetail> queryWrapper = QueryGenerator.initQueryWrapper(opersscFiddetail, req.getParameterMap());
            iOpersscFiddetailService.remove(queryWrapper);
            result.success("删除成功!");
        }


        return result;
    }


    /**
     * 导出excel
     *
     * @param request
     * @param response
     */
    @RequestMapping(value = "/exportXls")
    public ModelAndView exportXls(OpersscTp opersscTpQuery,HttpServletRequest request, HttpServletResponse response) {
        // Step.1 组装查询条件
        QueryWrapper<OpersscTp> queryWrapper = QueryGenerator.initQueryWrapper(opersscTpQuery, request.getParameterMap());

        //Step.2 AutoPoi 导出Excel
        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
        List<OpersscTpPage> pageList = new ArrayList<OpersscTpPage>();
        List<OpersscTp> opersscTpList = opersscTpService.list(queryWrapper);
        for (OpersscTp opersscTp : opersscTpList) {
            OpersscTpPage vo = new OpersscTpPage();
            BeanUtils.copyProperties(opersscTp, vo);
            List<OpersscTabdetail> opersscTabdetailList = opersscTabdetailService.selectByMainId(opersscTp.getId());
            vo.setOpersscTabdetailList(opersscTabdetailList);
            pageList.add(vo);
        }
        //导出文件名称
        mv.addObject(NormalExcelConstants.FILE_NAME, "手工脱敏表列表");
        mv.addObject(NormalExcelConstants.CLASS, OpersscTpPage.class);
        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("手工脱敏表列表数据", "导出人:Jeecg", "导出信息"));
        mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
        return mv;
    }

    /**
     * 通过excel导入数据
     *
     * @param request
     * @param response
     * @return
     */
    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
            MultipartFile file = entity.getValue();// 获取上传文件对象
            ImportParams params = new ImportParams();
            params.setTitleRows(2);
            params.setHeadRows(1);
            params.setNeedSave(true);
            try {
                List<OpersscTpPage> list = ExcelImportUtil.importExcel(file.getInputStream(), OpersscTpPage.class, params);
                for (OpersscTpPage page : list) {
                    OpersscTp po = new OpersscTp();
                    BeanUtils.copyProperties(page, po);
                    opersscTpService.saveMain(po, page.getOpersscTabdetailList());
                }
                return Result.ok("文件导入成功！数据行数:" + list.size());
            } catch (Exception e) {
                log.error(e.getMessage(), e);
                return Result.error("文件导入失败:" + e.getMessage());
            } finally {
                try {
                    file.getInputStream().close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return Result.ok("文件导入失败！");
    }
}
